/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package br.siagefi.mb;

import br.siagefi.model.Lancamento;
import br.siagefi.model.NotaFiscal;
import br.siagefi.model.Pessoa;
import br.siagefi.service.NotaFiscalService;
import br.siagefi.util.FacesUtil;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;

/**
 *
 * @author Paulo Lavarini
 */

@SessionScoped
@ManagedBean
public class NotaFiscalBean implements Serializable{
    
   private NotaFiscal notaFiscal;
   private final NotaFiscalService service;
   private Lancamento lancamento;
   private List<NotaFiscal> notasFiscais;
   private String origem;
   private double valorBruto, valorRetencao, valorImposto;

    public NotaFiscalBean() {
        this.notaFiscal = new NotaFiscal();
        this.notaFiscal.getDocumento().setOrigem("CLIENTE_PJ");
        this.notasFiscais = new ArrayList<>();
        this.service = new NotaFiscalService();
        this.lancamento = new Lancamento();
        this.valorBruto = 0;
        this.valorRetencao = 0;
        this.valorImposto = 0;
        this.listar();
    }
    
    // regras de negócio
    
    public String inserirDocumento(){
        this.getNotaFiscal().getDocumento().setOrigem(this.getOrigem());
        this.getNotaFiscal().setDocumento(service.incluirDocumento(this.getNotaFiscal()));
        if(this.getNotaFiscal().getDocumento() == null){
            FacesUtil.addErrorMessage("Erro na inclusão do documento.");
        }else {
            FacesUtil.addSuccessMessage("Documento incluido com sucesso!");
        }
        return "incluirNotaFiscal";
    }
    
    public String alterarLancamento(){
        int indice = this.getNotaFiscal().getDocumento().getLancamentos().indexOf(this.getLancamento());
        this.getNotaFiscal().getDocumento().getLancamentos().set(indice, lancamento);
        return "incluirNotaFiscal";
    }
    
    public void receberValorBruto(AjaxBehaviorEvent event){
        String valor = event.getComponent().getAttributes().get("value").toString();
        this.setValorBruto(Double.parseDouble(valor));
    }
    
    public void calcularRetencao(AjaxBehaviorEvent event){
        String valor = event.getComponent().getAttributes().get("value").toString();
        this.setValorRetencao(this.getValorBruto() * Double.parseDouble(valor));
    }
    
    public void calcularImpostoUnico(AjaxBehaviorEvent event){
        String valor = event.getComponent().getAttributes().get("value").toString();
        this.setValorImposto(this.getValorBruto() * Double.parseDouble(valor));
    }
    
    // navegação
    
    //template
    public String gerenciarNotaFiscal(){
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("notaFiscalBean");
        return "/pages/users/operador/notaFiscal";
    }
    
    public String consultar(NotaFiscal notaFiscal){
        this.setNotaFiscal(notaFiscal);
        return "consultarNotaFiscal";
    }
    
    public String editarLancamento(Lancamento lancamento){
        this.setLancamento(lancamento);
        return "alterarLancamentoNF";
    }
    
    // persistência
    
    public String gravar(){
       if(this.getNotaFiscal().getId() == null){
           //incluir
           if(service.jaExiste(this.getNotaFiscal())){
              FacesUtil.addErrorMessage("NotaFiscal já cadastrada.");
           }else {
              service.gravarNotaFiscal(this.getNotaFiscal());
              FacesUtil.addSuccessMessage("NotaFiscal incluida com sucesso!");
              service.atualizaSaldo(this.getNotaFiscal());
           }
        }else{ 
           //alterar
           service.alterar(notaFiscal);
           FacesUtil.addSuccessMessage("NotaFiscal alterada com sucesso!");
           service.atualizaSaldo(this.getNotaFiscal());
       }
       this.limpar();
       this.listar();
       return "notaFiscal";
    }
    
    public String remover(NotaFiscal notaFiscal){
        if(service.existeLancamentoVinculado(notaFiscal)){
            service.reverterLancamentos(notaFiscal);
        }
        service.remover(notaFiscal);
        this.limpar();
        FacesUtil.addSuccessMessage("NotaFiscal excluida com sucesso!");
        this.listar();
        return "notaFiscal";
    }
    
    public final void listar(){
         this.setNotasFiscais(service.listar()); 
    }

    // métodos de apoio
    
    public String voltar(){
        this.limpar();
        this.listar();
        return "notaFiscal";
    }
    
    public void limpar(){
        this.setNotaFiscal(new NotaFiscal());
        this.getNotaFiscal().getDocumento().setOrigem("CLIENTE_PJ");
        this.setNotasFiscais(new ArrayList<NotaFiscal>());
        this.setLancamento(new Lancamento());
        this.setValorBruto(0);
        this.setValorRetencao(0);
        this.setValorImposto(0);
    }
    
    public void buscaClientePorTipo(AjaxBehaviorEvent event){
        String tpCliente = event.getComponent().getAttributes().get("value").toString();
        System.out.println(tpCliente);
        this.getNotaFiscal().getDocumento().setOrigem(tpCliente);
    }
    
    
    // listas e enuns
    
     public List<Pessoa> getClientes() {
        System.out.println(this.getNotaFiscal().getDocumento().getOrigem());
        return this.service.listarClientes(this.getNotaFiscal().getDocumento().getOrigem());
    }

    // getters e setters

    public NotaFiscal getNotaFiscal() {
        return notaFiscal;
    }

    public void setNotaFiscal(NotaFiscal notaFiscal) {
        this.notaFiscal = notaFiscal;
    }

    public List<NotaFiscal> getNotasFiscais() {
        return notasFiscais;
    }

    public void setNotasFiscais(List<NotaFiscal> notasFiscais) {
        this.notasFiscais = notasFiscais;
    }

    public String getOrigem() {
        return origem;
    }

    public void setOrigem(String origem) {
        this.origem = origem;
    }

    public Lancamento getLancamento() {
        return lancamento;
    }

    public void setLancamento(Lancamento lancamento) {
        this.lancamento = lancamento;
    }

    public double getValorBruto() {
        return valorBruto;
    }

    public void setValorBruto(double valorBruto) {
        this.valorBruto = valorBruto;
    }

    public double getValorRetencao() {
        return valorRetencao;
    }

    public void setValorRetencao(double valorRetencao) {
        this.valorRetencao = valorRetencao;
    }

    public double getValorImposto() {
        return valorImposto;
    }

    public void setValorImposto(double valorImposto) {
        this.valorImposto = valorImposto;
    }
    
    
    
    
}
